<!Doctype html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<title>为 Java 程序员准备的 Go 语言入门 PPT | 菜鸟教程</title>

  <meta name='robots' content='max-image-preview:large' />
<link rel='stylesheet' id='classic-theme-styles-css' href='../0/classic-themes.min.css?ver=6.2' type='text/css' media='all' />
<link rel="canonical" href="../w3cnote/go-for-java-programmers.html" />
<meta name="keywords" content="为 Java 程序员准备的 Go 语言入门 PPT">
<meta name="description" content="这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT，为 Java 程序员快速入门 Go 而准备的。     视频    这个 PPT 是 2015年4月23日在 NYJavaSIG 中使用的。    前往 YouTube 观看视频      主要内容    1. Go 是什么，谁在使用 Go？ 2. 比较 Go 和 Java 3. 代码示例 4. 并发 5. 工具    Go 是什么？    “G..">
		
	<link rel="shortcut icon" href="https://static.runoob.com/images/favicon.ico">
	<link rel="stylesheet" href="../0/style.css?v=1.170" type="text/css" media="all" />	
	<link rel="stylesheet" href="../0/font-awesome.min.css" media="all" />	
  <!--[if gte IE 9]><!-->
  <script src=""></script>
  <!--<![endif]-->
  <!--[if lt IE 9]>
     <script src=""></script>
     <script src=""></script>
  <![endif]-->
  <link rel="apple-touch-icon" href="https://static.runoob.com/images/icon/mobile-icon.png"/>
  <meta name="apple-mobile-web-app-title" content="菜鸟教程">
</head>
<body>

<!--  头部 -->
<div class="container logo-search">

  <div class="col search row-search-mobile">
    <form action="index.php">
      <input class="placeholder" placeholder="搜索……" name="s" autocomplete="off">
      
    </form>
  </div>

  <div class="row">
    <div class="col logo">
      <h1><a href="../">菜鸟教程 -- 学的不仅是技术，更是梦想！</a></h1>
    </div>
        <div class="col right-list"> 
    <button class="btn btn-responsive-nav btn-inverse" data-toggle="collapse" data-target=".nav-main-collapse" id="pull" style=""> <i class="fa fa-navicon"></i> </button>
    </div>
        
    <div class="col search search-desktop last">
      <div class="search-input" >
      <form action="//www.runoob.com/" target="_blank">
        <input class="placeholder" id="s" name="s" placeholder="搜索……"  autocomplete="off" style="height: 44px;">
      </form>
      
      </div>
    </div>
  </div>
</div>



<!-- 导航栏 -->
<div class="container navigation">
    <div class="row">
        <div class="col nav">
            

                        <ul class="pc-nav" id="note-nav">
                <li><a href="../">首页</a></li>
                <li><a href="../w3cnote">笔记首页</a></li>
                <li><a href="../w3cnote/android-tutorial-intro.html" title="Android 基础入门教程">Android</a></li>
                <li><a href="../w3cnote/es6-tutorial.html" title="ES6 教程">ES6 教程</a></li>
                <li><a href="../w3cnote/ten-sorting-algorithm.html" title="排序算法">排序算法</a></li>
                <li><a href="../w3cnote/hadoop-tutorial.html" title="Hadoop 教程">Hadoop</a></li>
                <li><a href="../w3cnote/zookeeper-tutorial.html" title="Zookeeper 教程">Zookeeper</a></li>
                <li><a href="../w3cnote/verilog-tutorial.html" title="Verilog 教程">Verilog</a></li>
                <li><a href="../w3cnote_genre/code" title="编程技术">编程技术</a></li> 
                <li><a href="../w3cnote_genre/coderlife" title="程序员人生">程序员人生</a></li>
                
                <!--<li><a href="javascript:;" class="runoob-pop">登录</a></li>
                
                
                        <li>
                <a style="font-weight:bold;" href="../linux/linux-tutorial.html#yunserver" target="_blank" onclick="_hmt.push(['_trackEvent', 'aliyun', 'click', 'aliyun'])" title="kkb">云服务器</a>
                </li>
                <li><a href="http://gk.link/a/104mQ" target="_blank" style="font-weight: bold;"onclick="_hmt.push(['_trackEvent', '极客时间', 'click', 'jike'])" title="我的圈子">极客时间</a></li>
            
                
                <li><a target="_blank" href="../shoppinglist" rel="nofollow">知识店铺</a></li> 
        -->
            </ul>
                        
              
            <ul class="mobile-nav">
                <li><a href="../w3cnote">首页</a></li>
                <li><a href="../w3cnote_genre/android" target="_blank" title="Android 基础入门教程">Android</a></li>
                <li><a href="../w3cnote/es6-tutorial.html" target="_blank" title="ES6 教程">ES6</a></li>
                <li><a href="../w3cnote_genre/joke" target="_blank" title="程序员笑话">逗乐</a></li>
                
                <a href="javascript:void(0)" class="search-reveal">Search</a> 
            </ul>
            
        </div>
    </div>
</div>


<!--  内容  -->
<div class="container main">
	<div class="row">

		<div class="col middle-column big-middle-column">
	 			<div class="article">
			<div class="article-heading">
				<h2>为 Java 程序员准备的 Go 语言入门 PPT</h2>				<h3><em>分类</em> <a href="../w3cnote_genre/code" title="编程技术" >编程技术</a> </h3>
			</div>
			<div class="article-body note-body">
				<div class="article-intro">
					<p> 这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT，为 Java 程序员快速入门 Go 而准备的。 </p> 
<p><img decoding="async" src="//www.runoob.com/wp-content/uploads/2015/06/wKioL1QFLoOS7rziAABFW0UotVc107.jpg" alt="为 Java 程序员准备的 Go 语言入门 PPT" width="435" height="255" class="alignnone size-full wp-image-12130" srcset="http://www.runoob.com/wp-content/uploads/2015/06/wKioL1QFLoOS7rziAABFW0UotVc107.jpg 435w, http://www.runoob.com/wp-content/uploads/2015/06/wKioL1QFLoOS7rziAABFW0UotVc107-300x176.jpg 300w" sizes="(max-width: 435px) 100vw, 435px" /></p>
<h3 id="content_h3_1_7"> 视频 </h3> 
<p> 这个 PPT 是 2015年4月23日在 <a href="http://javasig.com" target="_blank" rel="nofollow">NYJavaSIG</a> 中使用的。 </p> 
<p> <a href="https://www.youtube.com/watch?v=_c_tQ6_3cCg" target="_blank" rel="nofollow">前往 YouTube 观看视频 <br> </a> </p> 
<h3 id="content_h3_1_14"> 主要内容 </h3> 
<p> 1. Go 是什么，谁在使用 Go？<br> 2. 比较 Go 和 Java<br> 3. 代码示例<br> 4. 并发<br> 5. 工具 </p> 
<h3 id="content_h3_1_20"> Go 是什么？ </h3> 
<p> "Go 是开源的编程语言，可以很简单的构建简单，可靠和高效的软件。" </p> 
<p> <a href="http://golang.org" target="_blank" rel="nofollow">golang.org</a> </p> 
<h3 id="content_h3_1_25"> Go 的历史 </h3> 
<p> 从 2007 后半年开始设计 </p> 
<ul> 
 <li> Robert Griesemer, Rob Pike 和 Ken Thompson. </li> 
 <li> Ian Lance Taylor 和 Russ Cox </li> 
</ul> 
<p> 从 2009 年开始开源，有一个非常活跃的社区。 </p> 
<p> Go 语言稳定版本 Go 1 是在 2012 年早期发布的。 </p> 
<h3 id="content_h3_1_34"> 为什么有 Go？ </h3> 
<p> Go 是解决 Google 规模的一个解决方案。 </p> 
<h3 id="content_h3_1_37"> 系统规模 </h3> 
<ul> 
 <li> 规划的规模为 10⁶⁺ 台机器 </li> 
 <li> 每天在几千台机器上作业 </li> 
 <li> 在系统中与其他作业进行协作，交互 </li> 
 <li> 同一时间进行大量工作 </li> 
</ul> 
<p> 解决方案：对并发的支持非常强大 </p> 
<h3 id="content_h3_1_48"> 第二个问题：工程规模 </h3> 
<p> 在 2011 年 </p> 
<ul> 
 <li> 跨 40+ 办公室的 5000+ 名开发者 </li> 
 <li> 每分钟有 20+ 修改 </li> 
 <li> 每个月修改 50% 的代码基础库 </li> 
 <li> 每天执行 5千万的测试用例 </li> 
 <li> 单个代码树 </li> 
</ul> 
<p> 解决方案：为大型代码基础库而设计的语言 </p> 
<h3 id="content_h3_1_62"> 谁在 Google 使用 Go？ </h3> 
<p> 大量的项目，几千位 Go 程序员，百万行的 Go 代码。 </p> 
<p> 公开的例子： </p> 
<ul> 
 <li> 移动设备的 Chrome SPDY 代理 </li> 
 <li> Chrome, ChromeOS, Android SDK, Earth 等等的下载服务器 </li> 
 <li> YouTube Vitess MySQL 均衡器 </li> 
</ul> 
<p> 主要任务是网络服务器，但是这是通用的语言。 </p> 
<h3 id="content_h3_1_75"> 除了 Google 还有谁在使用 Go？ </h3> 
<p> <a href="http://golang.org/wiki/GoUsers" target="_blank" rel="nofollow">golang.org/wiki/GoUsers</a> </p> 
<p> Apcera, Bitbucket, bitly, Canonical, CloudFlare, Core OS, Digital Ocean, Docker, Dropbox, Facebook, Getty Images, GitHub, Heroku, Iron.io, Kubernetes, Medium, MongoDB services, Mozilla services, New York Times, pool.ntp.org, Secret, SmugMug, SoundCloud, Stripe, Square, Thomson Reuters, Tumblr, ... </p>

<h2 id="content_h2_2_5"> 比较 Go 和 Java </h2> 
<h3 id="content_h3_2_7"> Go 和 Java 有很多共同之处 </h3> 
<ul> 
 <li> C 系列 (强类型，括号) </li> 
 <li> 静态类型 </li> 
 <li> 垃圾收集 </li> 
 <li> 内存安全 (nil 引用，运行时边界检查) </li> 
 <li> 变量总是初始化 (zero/nil/false) </li> 
 <li> 方法 </li> 
 <li> 接口 </li> 
 <li> 类型断言 (实例) </li> 
 <li> 反射 </li> 
</ul> 
<h3 id="content_h3_2_27"> Go 与 Java 的不同之处 </h3> 
<ul> 
 <li> 代码程序直接编译成机器码，没有 VM </li> 
 <li> 静态链接二进制 </li> 
 <li> 内存布局控制 </li> 
 <li> 函数值和词法闭包 </li> 
 <li> 内置字符串 (UTF-8) </li> 
 <li> 内置泛型映射和数组/片段 </li> 
 <li> 内置并发 </li> 
</ul> 
<h3 id="content_h3_2_43"> Go 特意去掉了大量的特性 </h3> 
<ul> 
 <li> 没有类 </li> 
 <li> 没有构造器 </li> 
 <li> 没有继承 </li> 
 <li> 没有 final </li> 
 <li> 没有异常 </li> 
 <li> 没有注解 </li> 
 <li> 没有自定义泛型 </li> 
</ul> 
<h3 id="content_h3_2_59"> 为什么 Go 要省去那些特性？ </h3> 
<p> 代码清晰明了是首要的 </p> 
<p> 当查看代码时，可以很清晰的知道程序将会做什么 </p> 
<p> 当编写代码的时候，也可以很清晰的让程序做你想做的 </p> 
<p> 有时候这意味着编写出一个循环而不是调用一个模糊的函数。 </p> 
<p> (不要变的太枯燥) </p> 
<p> 详细的设计背景请看： </p> 
<ul> 
 <li> <a href="http://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html" target="_blank" rel="nofollow">Less is exponentially more (Pike, 2012)</a> </li> 
 <li> <a href="http://talks.golang.org/2012/splash.article" target="_blank" rel="nofollow">Go at Google: Language Design in the Service of Software Engineering (Pike, 2012)</a> </li> 
</ul>

<h2 id="content_h2_3_5"> 示例 </h2> 
<h3 id="content_h3_3_7"> Java程序猿对Go应该很眼熟 </h3> 
<p> Main.java </p> 
<pre>
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
</pre> 
<p> hello.go </p> 
<pre>
package main
import "fmt"
func main() {
    fmt.Println("Hello, 世界!")
}
</pre> 
<h3 id="content_h3_3_12"> Hello, web server（你好，web服务） </h3> 
<p> package main </p> 
<pre>
import (
    "fmt"
    "log"
    "net/http"
)
func main() {
    http.HandleFunc("/hello", handleHello)
    fmt.Println("serving on http://localhost:7777/hello")
    log.Fatal(http.ListenAndServe("localhost:7777", nil))
}
func handleHello(w http.ResponseWriter, req *http.Request) {
    log.Println("serving", req.URL)
    fmt.Fprintln(w, "Hello, 世界!")
}
</pre> 
<p> （访问权限）类型根据变量名来声明。<br> 公共变量名首字大写，私有变量首字母小写。 </p> 
<h3 id="content_h3_3_17"> 示例：Google </h2> 前端 </h3> 
<p> <br> </p> 
<pre>
func main() {
    http.HandleFunc("/search", handleSearch)
    fmt.Println("serving on http://localhost:8080/search")
    log.Fatal(http.ListenAndServe("localhost:8080", nil))
}
// handleSearch handles URLs like "/search?q=golang" by running a
// Google search for "golang" and writing the results as HTML to w.
func handleSearch(w http.ResponseWriter, req *http.Request) {
</pre> 
<h3 id="content_h3_3_21"> 请求验证 </h3> 
<pre>
func handleSearch(w http.ResponseWriter, req *http.Request) {
    log.Println("serving", req.URL)
    // Check the search query.
    query := req.FormValue("q")
    if query == "" {
        http.Error(w, `missing "q" URL parameter`, http.StatusBadRequest)
        return
    }
</pre> 
<p> FormValueis 是 *http.Request 的一个方法: </p> 
<pre>
package http
type Request struct {...}
func (r *Request) FormValue(key string) string {...}
</pre> 
<p> query := req.FormValue("q")初始化变量query，其变量类型是右边表达式的结果，这里是string类型. &nbsp; </p> 
<h3 id="content_h3_3_26"> 取搜索结果 </h3> 
<pre>
// Run the Google search.
    start := time.Now()
    results, err := Search(query)
    elapsed := time.Since(start)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
</pre> 
<p> Search方法有两个返回值，分别为结果results和错误error. </p> 
<pre>
func Search(query string) ([]Result, error) {...}
</pre> 
<p> 当error的值为nil时，results有效。 </p> 
<pre>
type error interface {
    Error() string // a useful human-readable error message
}
</pre> 
<p> Error类型可能包含额外的信息，可通过断言访问。&nbsp; </p> 
<h3 id="content_h3_3_33"> 渲染搜索结果 </h3> 
<pre>
// Render the results.
    type templateData struct {
        Results []Result
        Elapsed time.Duration
    }
    if err := resultsTemplate.Execute(w, templateData{
        Results: results,
        Elapsed: elapsed,
    }); err != nil {
        log.Print(err)
        return
    }
</pre> 
<p> 结果results使用Template.Execute生成HTML，并存入一个io.Writer： </p> 
<pre>
type Writer interface {
        Write(p []byte) (n int, err error)
}
</pre> 
<p> http.ResponseWriter实现了io.Writer接口。 </p> 
<h3 id="content_h3_3_38"> Go变量操作HTML模板 </h3> 
<pre>
// A Result contains the title and URL of a search result.
type Result struct {
    Title, URL string
}
var resultsTemplate = template.Must(template.New("results").Parse(`
&lt;html&gt;
&lt;head/&gt;
&lt;body&gt;
  &lt;ol&gt;
  {{range .Results}}
    &lt;li&gt;{{.Title}} - &lt;a href="{{.URL}}"&gt;{{.URL}}&lt;/a&gt;&lt;/li&gt;
  {{end}}
  &lt;/ol&gt;
  &lt;p&gt;{{len .Results}} results in {{.Elapsed}}&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
`))
</pre> 
<h3 id="content_h3_3_40"> 请求Google搜索API </h3> 
<pre>
func Search(query string) ([]Result, error) {
    // Prepare the Google Search API request.
    u, err := url.Parse("https://ajax.googleapis.com/ajax/services/search/web?v=1.0")
    if err != nil {
        return nil, err
    }
    q := u.Query()
    q.Set("q", query)
    u.RawQuery = q.Encode()
    // Issue the HTTP request and handle the response.
    resp, err := http.Get(u.String())
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
</pre> 
<p> defer声明使resp.Body.Close运行在Search方法返回时。 </p> 
<h3 id="content_h3_3_43"> 解析返回的JSON数据到Go struct类型 </h3> 
<p> <a href="https://developers.google.com/web-search/docs/#fonje" target="_blank" rel="nofollow">developers.google.com/web-search/docs/#fonje</a> </p> 
<pre>
var jsonResponse struct {
        ResponseData struct {
            Results []struct {
                TitleNoFormatting, URL string
            }
        }
    }
    if err := json.NewDecoder(resp.Body).Decode(&amp;jsonResponse); err != nil {
        return nil, err
    }
    // Extract the Results from jsonResponse and return them.
    var results []Result
    for _, r := range jsonResponse.ResponseData.Results {
        results = append(results, Result{Title: r.TitleNoFormatting, URL: r.URL})
    }
    return results, nil
}
</pre> 
<h3 id="content_h3_3_47"> 这就是它的前端 </h3> 
<p> 所有引用的包都来自标准库： </p> 
<pre>
import (
    "encoding/json"
    "fmt"
    "html/template"
    "log"
    "net/http"
    "net/url"
    "time"
)
</pre> 
<p> Go服务器规模：每一个请求都运行在自己的goroutine里。 </p> 
<p> 让我们谈谈并发。 </p> 
<h3 id="content_h3_3_52"> 通信顺序进程(Hoare,1978) </h3> 
<p> 并发程序作为独立进程，通过信息交流的顺序执行。 </p> 
<p> 顺序执行很容易理解，异步则不是。 </p> 
<p> "不要为共亨内存通信，为通信共享内存。" </p> 
<p> <strong>Go原理:</strong> goroutines, channels, 和 select声明. </p> 
<h3 id="content_h3_3_58"> Goroutines </h3> 
<p> Goroutines 就像轻量级线程。 </p> 
<p> 它们通过小<span></span>栈（tiny stacks）和按需调整运行。<span></span> </p> 
<p> Go&nbsp;程序可以拥有成千上万个<span style="font-size:13.3333330154419px;">（goroutines</span><span style="font-size:13.3333330154419px;">）</span>实例 </p> 
<p> 使用go声明启动一个goroutines： </p> 
<pre>
go f(args)
</pre> 
<p> <span style="line-height:1.5;font-size:10pt;">Go运行时把goroutines放进OS线程里。</span> </p> 
<p> <span style="line-height:1.5;font-size:10pt;">不要使用线程堵塞goroutines。</span> </p> 
<h3 id="content_h3_3_72"> Channels </h3> 
<p> Channels被定义是为了与goroutines之间通信。 </p> 
<pre class="brush:shell;toolbar: true; auto-links: false;">
c := make(chan string)
 
// goroutine 1
c &lt;- "hello!"
 
// goroutine 2
s := &lt;-c
fmt.Println(s) // "hello!"
</pre> 
<h3 id="content_h3_3_75"> Select </h3> 
<p> select声明一个语句块来判断执行。 </p> 
<pre>
select {
case n := &lt;-in:
  fmt.Println("received", n)
case out &lt;- v:
  fmt.Println("sent", v)
}
</pre> 
<p> 只有条件成立的case块会运行。 </p> 
<h3 id="content_h3_3_79"> 示例：Google搜索（后端） </h3> 
<p> 问: Google搜索能做些什么？ </p> 
<p> 答: 提出一个问题，它可以返回一个搜索结果的页面（和一些广告）。 </p> 
<p> 问: 我们怎么得到这些搜索结果？ </p> 
<p> 答: 发送一个问题到网页搜索、图片搜索、YouTube（视频）、地图、新闻，稍等然后检索出结果。 </p> 
<p> 我们该怎么实现它？ </p> 
<h3 id="content_h3_3_85"> Google搜索 : 一个假的框架 </h3> 
<p> 我们要模拟一个搜索函数，让它随机超时0到100毫秒。 </p> 
<pre>
var (
    Web   = fakeSearch("web")
    Image = fakeSearch("image")
    Video = fakeSearch("video")
)
type Search func(query string) Result
func fakeSearch(kind string) Search {
    return func(query string) Result {
        time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
        return Result(fmt.Sprintf("%s result for %q\n", kind, query))
    }
}
</pre> 
<h3 id="content_h3_3_89"> Google搜索: 测试框架 </h3> 
<pre>
func main() {
    start := time.Now()
    results := Google("golang")
    elapsed := time.Since(start)
    fmt.Println(results)
    fmt.Println(elapsed)
}
</pre> 
<h3 id="content_h3_3_91"> Google搜索 (串行) </h3> 
<p> Google函数获取一个查询，然后返回一个的结果集 (不一定是字符串). </p> 
<p> Google按顺序调用Web（网页）、Image（图片）、Video（视频）并将返回加入到结果集中。 </p> 
<pre>
func Google(query string) (results []Result) {
    results = append(results, Web(query))
    results = append(results, Image(query))
    results = append(results, Video(query))
    return
}
</pre> 
<h3 id="content_h3_3_95"> Google搜索(并行) </h3> 
<p> 同时执行 Web,、Image、 和Video搜索，并等待所有结果。 </p> 
<p> func方法是在query和c的地方关闭的。</p> 
<pre class="brush:cpp; toolbar: true; auto-links: false;">
func Google(query string) (results []Result) {
    c := make(chan Result)
    go func() { c &lt;- Web(query) }()
    go func() { c &lt;- Image(query) }()
    go func() { c &lt;- Video(query) }()
    for i := 0; i &lt; 3; i++ {
        result := &lt;-c
        results = append(results, result)
    }
    return
}
</pre> 
<h3 id="content_h3_3_102"> Google搜索 (超时) </h3> 
<p> 等待慢的服务器。 </p> 
<p> 没有锁，没有条件变量，没有返回值。 </p> 
<pre>
    c := make(chan Result, 3)
    go func() { c &lt;- Web(query) }()
    go func() { c &lt;- Image(query) }()
    go func() { c &lt;- Video(query) }()
    timeout := time.After(80 * time.Millisecond)
    for i := 0; i &lt; 3; i++ {
        select {
        case result := &lt;-c:
            results = append(results, result)
        case &lt;-timeout:
            fmt.Println("timed out")
            return
        }
    }
    return
</pre> 
<h3 id="content_h3_3_106"> 防止超时 </h3> 
<p> 问: 如何防止丢掉慢的服务的结果？ </p> 
<p> 答: 复制这个服务，然后发送请求到多个复制的服务，并使用第一个响应的结果。 </p> 
<pre>
func First(query string, replicas ...Search) Result {
    c := make(chan Result, len(replicas))
    searchReplica := func(i int) { c &lt;- replicas[i](query) }
    for i := range replicas {
        go searchReplica(i)
    }
    return &lt;-c
}
</pre> 
<h3 id="content_h3_3_110"> 使用First函数 </h3> 
<pre>
func main() {
    start := time.Now()
    result := First("golang",
        fakeSearch("replica 1"),
        fakeSearch("replica 2"))
    elapsed := time.Since(start)
    fmt.Println(result)
    fmt.Println(elapsed)
}
</pre> 
<h3 id="content_h3_3_112"> Google搜索 (复制) </h3> 
<p> 使用复制的服务以减少多余延迟。 </p> 
<pre>
    c := make(chan Result, 3)
    go func() { c &lt;- First(query, Web1, Web2) }()
    go func() { c &lt;- First(query, Image1, Image2) }()
    go func() { c &lt;- First(query, Video1, Video2) }()
    timeout := time.After(80 * time.Millisecond)
    for i := 0; i &lt; 3; i++ {
        select {
        case result := &lt;-c:
            results = append(results, result)
        case &lt;-timeout:
            fmt.Println("timed out")
            return
        }
    }
    return
</pre>

<h3 id="content_h3_4_5"> 其他 </h3> 
<p> 没有锁，没有条件变量，没有调用。 </p> 
<h3 id="content_h3_4_8"> 总结 </h3> 
<p> 经过一些简单转换，我们使用 Go 的并发原语来转换一个 </p> 
<ul> 
 <li> 慢 </li> 
 <li> 顺序性的 </li> 
 <li> 故障敏感的 </li> 
</ul> 
<p> 程序为一个 </p> 
<ul> 
 <li> 快 </li> 
 <li> 并发 </li> 
 <li> 可复用的 </li> 
 <li> 健壮的 </li> 
</ul> 
<h2 id="content_h2_4_27"> 工具 </h2> 
<h3 id="content_h3_4_29"> Go 有很多强大的工具 </h3> 
<ul> 
 <li> gofmt 和 goimports </li> 
 <li> The go tool </li> 
 <li> godoc </li> 
 <li> IDE 和编辑器支持 </li> 
</ul> 
<p> 这语言就是为工具链设计的。 </p> 
<h3 id="content_h3_4_40"> gofmt 和 goimports </h3> 
<p> Gofmt 可以自动格式化代码，没有选项。 </p> 
<p> Goimports 基于你的工作空间更新导入声明 </p> 
<p> 大部分人可以安全的使用这些工具。 </p> 
<p> <a href="http://play.golang.org/p/GPqra77cBK" target="_blank" rel="nofollow">play.golang.org/p/GPqra77cBK</a> </p> 
<h3 id="content_h3_4_46"> The go tool </h3> 
<p> The go tool 可以在一个传统目录布局中用源代码构建 Go 程序。不需要 Makefiles 或者其他配置。 </p> 
<p> 匹配这些工具及其依赖，然后进行构建，安装： </p> 
<pre class="brush:shell;toolbar: true; auto-links: false;">
% go get golang.org/x/tools/cmd/present
</pre> 
<p> 运行： </p> 
<pre class="brush:shell;toolbar: true; auto-links: false;">
% present
</pre> 
<h3 id="content_h3_4_52"> godoc </h3> 
<p> 为世界上所有的开源 Go 代码生成文档： </p> 
<p> <a href="http://godoc.org" target="_blank" rel="nofollow">godoc.org</a> </p> 
<h3 id="content_h3_4_56"> IDE 和编辑器支持 </h3> 
<p> Eclipse, IntelliJ, emacs, vim 等等： </p> 
<ul> 
 <li> gofmt </li> 
 <li> goimports </li> 
 <li> godoclookups </li> 
 <li> code completion </li> 
 <li> code navigation </li> 
</ul> 
<p> 但是没有 "Go IDE"。 </p> 
<p> Go 工具无处不在。 </p> 
<h3 id="content_h3_4_72"> Go 的下一步计划 </h3> 
<p> Go 路线在线查看 </p> 
<p> <a href="http://tour.golang.org" target="_blank" rel="nofollow">tour.golang.org</a> </p> 
<p> 大量的学习资料 </p> 
<p> <a href="http://golang.org/wiki/Learn" target="_blank" rel="nofollow">golang.org/wiki/Learn</a> </p> 
<p> 完美的社区 </p> 
<p> <a href="http://golang.org/project" target="_blank" rel="nofollow">golang.org/project</a> </p> 
<h3 id="content_h3_4_83"> Thank you </h3> 
<p> Sameer Ajmani </p> 
<p> Tech Lead Manager, Go team </p> 
<p> Google </p> 
<p> <a href="http://twitter.com/Sajma" target="_blank" rel="nofollow">@Sajma</a> </p> 
<p> <a href="mailto:sameer@golang.org" target="_blank" rel="nofollow">sameer@golang.org</a> </p>				</div>
			</div>
			<div class="previous-next-links">
			<div class="previous-design-link">← <a href="../w3cnote/regular-expression-30-minutes-tutorial.html" rel="prev"> 正则表达式30分钟入门教程</a> </div>
			<div class="next-design-link"><a href="../w3cnote/php-standard.html" rel="next"> PHP开发规范</a> →</div>
			</div>
			<style>
.wrapper {
  /*text-transform: uppercase; */
  background: #ececec;
  color: #555;
  cursor: help;
  font-family: "Gill Sans", Impact, sans-serif;
  font-size: 20px;
  position: relative;
  text-align: center;
  width: 200px;
  -webkit-transform: translateZ(0); /* webkit flicker fix */
  -webkit-font-smoothing: antialiased; /* webkit text rendering fix */
}

.wrapper .tooltip {
  white-space: nowrap;
  font-size: 14px;
  text-align: left;
  background: #96b97d;
  bottom: 100%;
  color: #fff;
  display: block;
  left: -25px;
  margin-bottom: 15px;
  opacity: 0;
  padding: 14px;
  pointer-events: none;
  position: absolute;
  
  -webkit-transform: translateY(10px);
     -moz-transform: translateY(10px);
      -ms-transform: translateY(10px);
       -o-transform: translateY(10px);
          transform: translateY(10px);
  -webkit-transition: all .25s ease-out;
     -moz-transition: all .25s ease-out;
      -ms-transition: all .25s ease-out;
       -o-transition: all .25s ease-out;
          transition: all .25s ease-out;
  -webkit-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
     -moz-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
      -ms-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
       -o-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
          box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.28);
}
.tooltip a {
	color:#fff;
}
/* This bridges the gap so you can mouse into the tooltip without it disappearing */
.wrapper .tooltip:before {
  bottom: -20px;
  content: " ";
  display: block;
  height: 20px;
  left: 0;
  position: absolute;
  width: 100%;
}  

/* CSS Triangles - see Trevor's post */
.wrapper .tooltip:after {
  border-left: solid transparent 10px;
  border-right: solid transparent 10px;
  border-top: solid #96b97d 10px;
  bottom: -10px;
  content: " ";
  height: 0;
  left: 20%;
  margin-left: -13px;
  position: absolute;
  width: 0;
}
.wrapper .tooltip1 {
	margin-left: 50px;
	padding-top: 0px;
}
/*
.wrapper:hover .tooltip {
  opacity: 1;
  pointer-events: auto;
  -webkit-transform: translateY(0px);
     -moz-transform: translateY(0px);
      -ms-transform: translateY(0px);
       -o-transform: translateY(0px);
          transform: translateY(0px);
}
*/
/* IE can just show/hide with no transition */
.lte8 .wrapper .tooltip {
  display: none;
}

.lte8 .wrapper:hover .tooltip {
  display: block;
}

</style>

<link rel="stylesheet" href="../0/upvotejs.css">
<script src=""></script>
<script src=""></script>
<div id="respond" class="no_webshot"> 
		<div class="comment-signarea" style=" padding: 20px 20px;"> 
	<h3 class="text-muted" id="share_code" style="color: #799961;"><i class="fa fa-pencil-square-o" aria-hidden="true"></i> 点我分享笔记</h3>
	<!--
	<p style="font-size:14px;">笔记需要是本篇文章的内容扩展！</p><br>
	<p style="font-size:12px;"><a href="../tougao" target="_blank">文章投稿，可点击这里</a></p>
	<p style="font-size:14px;"><a href="../w3cnote/runoob-user-test-intro.html#invite" target="_blank">注册邀请码获取方式</a></p>
		<h3 class="text-muted"><i class="fa fa-info-circle" aria-hidden="true"></i> 分享笔记前必须<a href="javascript:;" class="runoob-pop">登录</a>！</h3>
		<p><a href="../w3cnote/runoob-user-test-intro.html#invite" target="_blank">注册邀请码获取方式</a></p>-->
	</div>
		
	<form action="/wp-content/themes/runoob/option/addnote.php" method="post" id="commentform" style="display:none;">
		<div class="comt">
			<div class="comt-title">
				<i style="font-size:36px;" class="fa fa-user-circle" aria-hidden="true"></i>				<p><a id="cancel-comment-reply-link" href="javascript:;">取消</a></p>
			</div>
			<div class="comt-box">
			<div id="mded"></div>
			
				<div class="comt-ctrl">
					<div class="comt-tips"><input type='hidden' name='comment_post_ID' value='12129' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</div>
					<button type="submit" name="submit" id="submit" tabindex="5"><i class="fa fa-pencil" aria-hidden="true"></i> 分享笔记</button>
				</div>
			</div>
		
				
					<div class="comt-comterinfo"> 
						<ul id="comment-author-info">
							<li class="form-inline"><label class="hide" for="author">昵称</label><input class="ipt" type="text" name="author" id="author" value="" tabindex="2" placeholder="昵称"><span class="text-muted">昵称 (必填)</span></li>
							<li class="form-inline"><label class="hide" for="email">邮箱</label><input class="ipt" type="text" name="email" id="email" value="" tabindex="3" placeholder="邮箱"><span class="text-muted">邮箱 (必填)</span></li>
							<li class="form-inline"><label class="hide" for="url">引用地址</label><input class="ipt" type="text" name="url" id="url" value="" tabindex="4" placeholder="引用地址"><span class="text-muted">引用地址</span></li>
						</ul>
					</div>
				
			
		</div>

	</form>
	</div>
<script type="text/javascript">
$(function() {
	//初始化编辑器
	
	var editor = new Simditor({
	  textarea: $('#mded'),
	  placeholder: '写笔记...',
	  upload:false,
	 // upload: {url:'/api/comment_upload_file.php',params: null,fileKey: 'upload_file',connectionCount: 1,leaveConfirm: '文件正在上传，您确定离开?'},
	  defaultImage: 'https://www.runoob.com/images/logo.png',
	  codeLanguages: '',
	  autosave: 'editor-content',
	  toolbar: [  'bold','code','ul','ol','image' ]
	});
	editor.on('selectionchanged', function() {
		$(".code-popover").hide();
	});

	// 提交数据
	$("#share_code").click(function() {
		$(".comment-signarea").hide();
		$("#commentform").show();
		
	});
	$("#user_add_note").click(function() {
		$(".comment-signarea").hide();
		$("#commentform").show();
		$('html, body').animate({
       	    scrollTop: $("#respond").offset().top
    	}, 200);
	});

	// 提交笔记
	var commentform=$('#commentform');
	commentform.prepend('<div id="comment-status" style="display:none;" ></div>');
	var statusdiv=$('#comment-status');
	
	commentform.submit(function(e){
		e.preventDefault();
		var noteContent = editor.getValue();
		// console.log(noteContent);
		noteContent = noteContent.replace(/<pre><code>/g,"<pre>");
		noteContent = noteContent.replace(/<\/code><\/pre>/g,"</pre>");
		
		// 系列化表单数据
		var comment_parent = 0;
		var is_user_logged_in = $("#is_user_logged_in").val();
		var comment_post_ID =  12129;
		var _wp_unfiltered_html_comment = $("#_wp_unfiltered_html_comment").val();
		var comment = noteContent;
		var author = $("#author").val();
		var url = $("#url").val();
		var email = $("#email").val();
		if(isBlank(author) && is_user_logged_in==0) {
			statusdiv.html('<p  class="ajax-error">请输入昵称！</p>').show();
		} else if(isBlank(email)  && is_user_logged_in==0) {
			statusdiv.html('<p  class="ajax-error">请输入邮箱！</p>').show();
		} else {
			// var formdata=commentform.serialize() + "&comment=" + noteContent ;
			// 添加状态信息
			statusdiv.html('<p>Processing...</p>').show();
			// 获取表单提交地址
			var formurl=commentform.attr('action');
			
			// 异步提交
			$.ajax({
					type: 'post',
					url: formurl,
					dataType:'json',
					data: {"comment_parent":comment_parent,"comment_post_ID":comment_post_ID, "_wp_unfiltered_html_comment":_wp_unfiltered_html_comment,"comment":comment,"url":url, "email":email,"author":author},
					error: function(XMLHttpRequest, textStatus, errorThrown){
					statusdiv.html('<p class="ajax-error" >数据不完整或表单提交太快了！</p>').show();
				},
				success: function(data, textStatus){
					if(data.errorno=="0") {
						$("#submit").prop('disabled', true);
						statusdiv.html('<p class="ajax-success" >笔记已提交审核，感谢分享笔记！</p>').show();
						alert('笔记已提交审核，感谢分享笔记！');
					}else{
						statusdiv.html('<p class="ajax-error" >'+data.msg+'</p>').show();
					}
					commentform.find('textarea[name=comment]').val('');
				}
			});
			setTimeout(function(){
		        $("#submit").prop('disabled', false);
		    }, 10*1000);
		}
		return false;

	});
	$(".comt-author").click(function() {
		href = $(this).children("a").attr("href");
		if(href.indexOf("/note/")!=-1) {
			var win = window.open(href, '_blank');
  			win.focus();
		}
	});
	$(".comt-meta span").hover(function(){
		$(this).children(".tooltip").css({ "opacity": 1, "pointer-events": "auto"});
	},function(){
		$(this).children(".tooltip").removeAttr("style");
	});
	/*
	$(".wrapper i").hover(function(){
		$(this).siblings(".tooltip").css({ "opacity": 1, "pointer-events": "auto"});
	},function(){
		$(this).siblings(".tooltip").css({ "opacity": 0, "pointer-events": "auto"});
	});
	*/
	//Upvote.create('runoobvote-id', {callback: vote_callback});
	var ajaxurl = 'https://www.runoob.com/wp-admin/admin-ajax.php';
	var callback = function(data) {
		//console.log($('#runoobvote-id').upvote('upvoted'));
		//console.log($('#runoobvote-id').upvote('downvoted'));
		//console.log(data);
		_vote_action = data.action;
		id_arr = data.id.split('-');
		um_id= id_arr[2];
		//console.log(um_id);
		
		var re = /^[1-9]+/;
		if (re.test(um_id)) { 
			var ajax_data = {
				_vote_action: _vote_action,
				action: "pinglun_zan",
				um_id: um_id,
				um_action: "ding"
			};
			//console.log(ajax_data);
			$.post(ajaxurl,ajax_data,function(status){
				//if(status.vote_num>999) {
				//	_voteHtml = '<span style="display: block; text-align: center;font-size: 20px; color: #6a737c; margin: 8px 0;">'+kFormatter(status.vote_num) +'</span>';
				//	$("#runoobvote-id-" + um_id + " .count").hide().after(_voteHtml);
				//}
				
			});
		}
	};
	if($('#comments').length && $('.upvotejs').length){
		$('.upvotejs').upvote({id: 12129, callback: callback});
	
		$.post(ajaxurl,{"action":"pinglun_zan","postid":12129},function(data){  
			$(data).each(function(key,value) {
				$("#runoobvote-id-" + value.commid + " .upvote").addClass(value.upvotejs_class);
				$("#runoobvote-id-" + value.commid + " .downvote").addClass(value.downvote_class);
				$("#runoobvote-id-" + value.commid + " .count").text(value.upvote_count);
			})
		},'json');
		
	}
	
	
});
function isBlank(str) {
    return (!str || /^\s*$/.test(str));
}
function kFormatter(num) {
	// return num;
    return Math.abs(num) > 999 ? Math.sign(num)*((Math.abs(num)/1000).toFixed(1)) + 'k' : Math.sign(num)*Math.abs(num)
}

</script>

<link rel="stylesheet" href="../0/qa.css?1.44">
<link rel="stylesheet" type="text/css" href="../0/simditor.min.css" />
<script type="text/javascript" src=""></script>
<script type="text/javascript" src=""></script>
<script type="text/javascript" src=""></script>
<script type="text/javascript" src=""></script>
<script type="text/javascript" src=""></script>
			<div class="article-heading-ad" id="w3cnote-ad728">
			<script async src=""></script>
			<!-- 移动版 自动调整 -->
			<ins class="adsbygoogle"
			     style="display:inline-block;min-width:300px;max-width:970px;width:100%;height:90px"
			     data-ad-client="ca-pub-5751451760833794"
			     data-ad-slot="1691338467"
			     data-ad-format="horizontal"></ins>
			<script>
			(adsbygoogle = window.adsbygoogle || []).push({});
			</script>
			</div>
			<style>
@media screen and (max-width: 768px) {
	#w3cnote-ad728 {
		display: none;
	}
}
p.note-author {
    border-bottom: 1px solid #ddd;
    font-size: 18px;
    font-weight: bold;
    color: #78a15a;
    padding-bottom: 2px;
    margin-bottom: 4px;
}
</style>
<script>
var aid = 12129;
</script>
	</div>
		
	</div>
	<div class="listcol last right-column">




<!--
	<div class="tab tab-light-blue"> 订阅</div>
	<div class="sidebar-box">
		<div class="socialicons">
			<a href="../feed" class="rss">RSS 订阅</a>
		
			<form action="//list.qq.com/cgi-bin/qf_compose_send" method="post">
			<input type="hidden" value="qf_booked_feedback" name="t">
			<input type="hidden" value="4b67b6b6c1f5e792559940cab4aebb8f1126fba880bff1a8" name="id">
			<input class="placeholder" id="feed_email" name="to" value="输入邮箱 订阅笔记" autocomplete="off">
			<input type="submit" value="订阅" class="btn btn-primary">
			</form>
		
		</div>
 
	</div>
-->	



<!--
	<div class="sidebar-box cate-list">
	<div class="sidebar-box recommend-here list-link">
			<a href="javascript:void(0);" style="font-size: 16px; color:#64854c;font-weight:bold;">笔记列表</a>
		</div>

 

</div>
-->

	 <div class="sidebar-box cate-list">
		 		

	 	<div class="sidebar-box recommend-here list-link">
			<a href="javascript:void(0);" style="font-size: 16px; color:#64854c;font-weight:bold;">教程列表</a>
		</div>
		
		<div class="cate-items"> 
				<a href="../ado">ADO 教程</a>
	<a href="../ajax">Ajax 教程</a>
	<a href="../android">Android 教程</a>
	<a href="../angularjs2">Angular2 教程</a>
	<a href="../angularjs">AngularJS 教程</a>
	<a href="../appml">AppML 教程</a>
	<a href="../asp">ASP 教程</a>
	<a href="../aspnet">ASP.NET 教程</a>
	<a href="../bootstrap">Bootstrap 教程</a>
	<a href="../bootstrap4">Bootstrap4 教程</a>
	<a href="../bootstrap5">Bootstrap5 教程</a>
	<a href="../cprogramming">C 教程</a>
	<a href="../csharp">C# 教程</a>
	<a href="../cplusplus">C++ 教程</a>
	<a href="../chartjs">Chart.js 教程</a>
	<a href="../cssref">CSS 参考手册</a>
	<a href="../css">CSS 教程</a>
	<a href="../css3">CSS3 教程</a>
	<a href="../django">Django 教程</a>
	<a href="../docker">Docker 教程</a>
	<a href="../dtd">DTD 教程</a>
	<a href="../echarts">ECharts 教程</a>
	<a href="../eclipse">Eclipse 教程</a>
	<a href="../firebug">Firebug 教程</a>
	<a href="../font-awesome">Font Awesome 图标</a>
	<a href="../foundation">Foundation 教程</a>
	<a href="../git">Git 教程</a>
	<a href="../go">Go 语言教程</a>
	<a href="../googleapi">Google 地图 API 教程</a>
	<a href="../highcharts">Highcharts 教程</a>
	<a href="../htmldom">HTML DOM 教程</a>
	<a href="../tags">HTML 参考手册</a>
	<a href="../charsets">HTML 字符集</a>
	<a href="../html">HTML 教程</a>
	<a href="../http">HTTP 教程</a>
	<a href="../ionic">ionic 教程</a>
	<a href="../ios">iOS 教程</a>
	<a href="../java">Java 教程</a>
	<a href="../jsref">JavaScript 参考手册</a>
	<a href="../js">Javascript 教程</a>
	<a href="../jeasyui">jQuery EasyUI 教程</a>
	<a href="../jquerymobile">jQuery Mobile 教程</a>
	<a href="../jqueryui">jQuery UI 教程</a>
	<a href="../jquery">jQuery 教程</a>
	<a href="../json">JSON 教程</a>
	<a href="../jsp">JSP 教程</a>
	<a href="../julia">Julia 教程</a>
	<a href="../kotlin">Kotlin 教程</a>
	<a href="../linux">Linux 教程</a>
	<a href="../lua">Lua 教程</a>
	<a href="../markdown">Markdown 教程</a>
	<a href="../matplotlib">Matplotlib 教程</a>
	<a href="../maven">Maven 教程</a>
	<a href="../memcached">Memcached 教程</a>
	<a href="../mongodb">MongoDB 教程</a>
	<a href="../mysql">MySQL 教程</a>
	<a href="../nodejs">Node.js 教程</a>
	<a href="../numpy">NumPy 教程</a>
	<a href="../pandas">Pandas 教程</a>
	<a href="../perl">Perl 教程</a>
	<a href="../php">PHP 教程</a>
	<a href="../postgresql">PostgreSQL 教程</a>
	<a href="../python3">Python 3 教程</a>
	<a href="../python">Python 基础教程</a>
	<a href="../r">R 教程</a>
	<a href="../rdf">RDF 教程</a>
	<a href="../react">React 教程</a>
	<a href="../redis">Redis 教程</a>
	<a href="../rss">RSS 教程</a>
	<a href="../ruby">Ruby 教程</a>
	<a href="../rust">Rust 教程</a>
	<a href="../sass">Sass 教程</a>
	<a href="../scala">Scala 教程</a>
	<a href="../scipy">SciPy 教程</a>
	<a href="../servlet">Servlet 教程</a>
	<a href="../soap">SOAP 教程</a>
	<a href="../sql">SQL 教程</a>
	<a href="../sqlite">SQLite 教程</a>
	<a href="../svg">SVG 教程</a>
	<a href="../svn">SVN 教程</a>
	<a href="../swift">Swift 教程</a>
	<a href="../tcpip">TCP/IP 教程</a>
	<a href="../typescript">TypeScript 教程</a>
	<a href="../vbscript">VBScript 教程</a>
	<a href="../vue2">Vue.js 教程</a>
	<a href="../vue3">Vue3 教程</a>
	<a href="../w3c">W3C 教程</a>
	<a href="../webservices">Web Service 教程</a>
	<a href="../wsdl">WSDL 教程</a>
	<a href="../xlink">XLink 教程</a>
	<a href="../dom">XML DOM 教程</a>
	<a href="../schema">XML Schema 教程</a>
	<a href="../xml">XML 教程</a>
	<a href="../xpath">XPath 教程</a>
	<a href="../xquery">XQuery 教程</a>
	<a href="../xslfo">XSLFO 教程</a>
	<a href="../xsl">XSLT 教程</a>
	<a href="../data-structures">数据结构</a>
	<a href="../regexp">正则表达式</a>
	<a href="../quiz">测验</a>
	<a href="../browsers">浏览器</a>
	<a href="../quality">网站品质</a>
	<a href="../web">网站建设指南</a>
	<a href="../hosting">网站服务器教程</a>
	<a href="../design-pattern">设计模式</a>
			
		</div> 
		 	 </div>
</div>
	</div>
</div>


<!-- 底部 -->
<div id="footer" class="mar-t50">
   <div class="runoob-block">
    <div class="runoob cf">
     <dl>
      <dt>
       在线实例
      </dt>
      <dd>
       &middot;<a target="_blank" href="../html/html-examples.html">HTML 实例</a>
      </dd>
      <dd>
       &middot;<a target="_blank" href="../css/css-examples.html">CSS 实例</a>
      </dd>
      <dd>
       &middot;<a target="_blank" href="../js/js-examples.html">JavaScript 实例</a>
      </dd>
      <dd>
       &middot;<a target="_blank" href="../ajx/ajax-examples.html">Ajax 实例</a>
      </dd>
       <dd>
       &middot;<a target="_blank" href="../jquery/jquery-examples.html">jQuery 实例</a>
      </dd>
      <dd>
       &middot;<a target="_blank" href="../xml/xml-examples.html">XML 实例</a>
      </dd>
      <dd>
       &middot;<a target="_blank" href="../java/java-examples.html">Java 实例</a>
      </dd>
     
     </dl>
     <dl>
      <dt>
      字符集&工具
      </dt>
      <dd>
       &middot; <a target="_blank" href="../charsets/html-charsets.html">HTML 字符集设置</a>
      </dd>
      <dd>
       &middot; <a target="_blank" href="../tags/html-ascii.html">HTML ASCII 字符集</a>
      </dd>
     <dd>
       &middot; <a target="_blank" href="https://c.runoob.com/front-end/6939/">JS 混淆/加密</a>
      </dd> 
      <dd>
       &middot; <a target="_blank" href="https://c.runoob.com/front-end/6232/">PNG/JPEG 图片压缩</a>
      </dd>
      <dd>
       &middot; <a target="_blank" href="../tags/html-colorpicker.html">HTML 拾色器</a>
      </dd>
      <dd>
       &middot; <a target="_blank" href="..//c.runoob.com/front-end/53">JSON 格式化工具</a>
      </dd>
      <dd>
       &middot; <a target="_blank" href="..//c.runoob.com/front-end/6680/">随机数生成器</a>
      </dd>
     </dl>
     <dl>
      <dt>
       最新更新
      </dt>
                   <dd>
       &middot;
      <a href="../matplotlib/matplotlib-imread.html" title="Matplotlib imread() 方法">Matplotlib imre...</a>
      </dd>
              <dd>
       &middot;
      <a href="../matplotlib/matplotlib-imsave.html" title="Matplotlib imsave() 方法">Matplotlib imsa...</a>
      </dd>
              <dd>
       &middot;
      <a href="../matplotlib/matplotlib-imshow.html" title="Matplotlib imshow() 方法">Matplotlib imsh...</a>
      </dd>
              <dd>
       &middot;
      <a href="../matplotlib/matplotlib-hist.html" title="Matplotlib 直方图">Matplotlib 直方图</a>
      </dd>
              <dd>
       &middot;
      <a href="../python3/python-func-object.html" title="Python object() 函数">Python object()...</a>
      </dd>
              <dd>
       &middot;
      <a href="../python3/python-ai-draw.html" title="Python AI 绘画">Python AI 绘画</a>
      </dd>
              <dd>
       &middot;
      <a href="../w3cnote/cursor-editor.html" title="神辅助 Cursor 编辑器，加入 GPT-4 让编码更轻松！">神辅助 Cursor ...</a>
      </dd>
             </dl>
     <dl>
      <dt>
       站点信息
      </dt>
      <dd>
       &middot;
       <a target="_blank" href="mailto:admin@runoob.com" rel="external nofollow">意见反馈</a>
       </dd>
      <dd>
       &middot;
      <a target="_blank" href="../disclaimer">免责声明</a>
       </dd>
      <dd>
       &middot;
       <a target="_blank" href="../aboutus">关于我们</a>
       </dd>
      <dd>
       &middot;
      <a target="_blank" href="../archives">文章归档</a>
      </dd>
    
     </dl>
    
     <div class="search-share">
      <div class="app-download">
        <div>
         <strong>关注微信</strong>
        </div>
      </div>
      <div class="share">
      <img width="128" height="128" src="/wp-content/themes/runoob/assets/images/qrcode.png" />
       </div>
     </div>
     
    </div>
   </div>
   <div class="w-1000 copyright">
     Copyright &copy; 2013-2023    <strong><a href="../" target="_blank">菜鸟教程</a></strong>&nbsp;
    <strong><a href="../" target="_blank">runoob.com</a></strong> All Rights Reserved. 备案号：<a target="_blank" rel="nofollow" href="https://beian.miit.gov.cn/">闽ICP备15012807号-1</a>
   </div>
  </div>
  <div class="fixed-btn">
    <a class="go-top" href="javascript:void(0)" title="返回顶部"> <i class="fa fa-angle-up"></i></a>
    <a class="qrcode"  href="javascript:void(0)" title="关注我们"><i class="fa fa-qrcode"></i></a>
    <a class="writer" style="display:none" href="javascript:void(0)"   title="标记/收藏"><i class="fa fa-star" aria-hidden="true"></i></a>
    <!-- qrcode modal -->
    <div id="bottom-qrcode" class="modal panel-modal hide fade in">
      <h4>微信关注</h4>
      <div class="panel-body"><img alt="微信关注" width="128" height="128" src="/wp-content/themes/runoob/assets/images/qrcode.png"></div> 
    </div>
  </div>

 <div style="display:none;">
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-84264393-2"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-84264393-2');
</script>
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?3eec0b7da6548cf07db3bc477ea905ee";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

</div>
<script>
window.jsui={
    www: 'https://www.runoob.com',
    uri: 'https://www.runoob.com/wp-content/themes/runoob'
};
</script>

<script src=""></script>
<script src=""></script>

</body>
</html>